//
// Community.CsharpSqlite.SQLiteClient.SqliteParameter.cs
//
// Represents a parameter to a SqliteCommand, and optionally, its mapping to 
// DataSet columns.
//
// Author(s): Vladimir Vukicevic  <vladimir@pobox.com>
//            Everaldo Canuto  <everaldo_canuto@yahoo.com.br>
//
// Copyright (C) 2002  Vladimir Vukicevic
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
// 
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
// 
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//

using System.Data;

#if NET_2_0
using System.Data.Common;
#endif

namespace Community.CsharpSqlite.SQLiteClient
{
    public class SqliteParameter :
#if NET_2_0
		DbParameter
#else
        IDbDataParameter
#endif
    {
        #region Fields

        private DbType type;
        private DbType originalType;
        private bool typeSet;
        private readonly bool isNullable;
        private bool sourceColumnNullMapping;

        #endregion

        #region Constructors and destructors

        public SqliteParameter()
        {
            type = DbType.String;
            Direction = ParameterDirection.Input;
            isNullable = true;
        }

        public SqliteParameter(string name, DbType type)
        {
            this.ParameterName = name;
            this.type = type;
            isNullable = true;
        }

        public SqliteParameter(string name, object value)
        {
            this.ParameterName = name;
            type = DbType.String;
            Value = value;
            Direction = ParameterDirection.Input;
            isNullable = true;
        }

        public SqliteParameter(string name, DbType type, int size) : this(name, type)
        {
            this.Size = size;
        }

        public SqliteParameter(string name, DbType type, int size, string src_column) : this(name, type, size)
        {
            SourceColumn = src_column;
        }

        #endregion

        #region Properties

#if NET_2_0
		override
#endif

        public DbType DbType
        {
            get { return type; }
            set
            {
                if (!typeSet)
                {
                    originalType = type;
                    typeSet = true;
                }
                type = value;
                if (!typeSet)
                    originalType = type;
            }
        }

#if NET_2_0
		override
#endif
        public ParameterDirection Direction { get; set; }

#if NET_2_0
		override
#endif

        public bool IsNullable
        {
            get { return isNullable; }
#if NET_2_0
			set { isNullable = value; }
#endif
        }

#if NET_2_0
		override
#endif
        public string ParameterName { get; set; }

        public byte Precision { get; set; }

        public byte Scale { get; set; }

#if NET_2_0
		override
#endif
        public int Size { get; set; }

#if NET_2_0
		override
#endif
        public string SourceColumn { get; set; }

#if NET_2_0
		public override bool SourceColumnNullMapping {
			get { return sourceColumnNullMapping; }
			set { sourceColumnNullMapping = value; }
		}
#endif

#if NET_2_0
		override
#endif
        public DataRowVersion SourceVersion { get; set; }

#if NET_2_0
		override
#endif
        public object Value { get; set; }

        #endregion

        #region methods

#if NET_2_0
		public override void ResetDbType ()
		{
			type = originalType;
		}
#endif

        #endregion
    }
}